Welcome to pandas!

4.2 正则表达式

1、从开始位置匹配

import re

t1=re.match( "apple","apple草果" ) #只能从第一个字符开始,如果不是,则返回none

t2=re.compile( "apple" ).match( "abapple草果" , 2 )

print (t1)

print (t2)

s1=re.fullmatch( "apple","apple草果" ) #完全匹配,如果不是,则返回none

s2=re.compile( "apple" ).fullmatch( "apple草果" ) #完全匹配,如果不是,则返回none

print (s1)

print (s2)

返回:

<re.Match object; span=(0, 5), match='apple'>

<re.Match object; span=(2, 7), match='apple'>

None

None


2、从任意位置开始匹配

Match()函数是必须从指定的起始位置开始匹配,如果希望从任意位置开始匹配,则可以使用search()函数, 如果匹配成功,则返回re.match对象

Match()和search()函数做匹配时,可能有多个符合匹配要求,但只返回第1个成功的re.match对象。

import re

t1=re.compile( "apple" ).search( "abapple苹果" )

print (t1)

s1=re.compile( "apple" )

s=s1.search( "234apple苹果apple" ) #只匹配第一个符合要求的字符串

print (s)

返回:

<re.Match object; span=(2, 7), match='apple'>

<re.Match object; span=(3, 8), match='apple'>


3、用列表存储匹配成功的值

前面学习的match()和search()函数只返回第1次匹配成功的re.match对象, 如果希望返回所有匹配成功的数据,可以使用findall()函数,返回的结果是列表类型, 如果没有匹配成功,则会返回空列表。

通过上面的示例发现,findall()函数如果没有分组,则直接返回匹配成功的所有字符串, 如果只有一个分组,则将分组中的值返回到列表,如果多于1个分组, 则列表中的每个元素是元组,而元组的元素则是每个分组的值


import re

text= "小张34小明16欧阳大明45小曾32"

t1=re.findall( "\D+\d+" ,text)

t2=re.findall( "(\D+)\d+" ,text)

t3=re.findall( "(\D+)(\d+)" ,text)

p=re.compile( "(\D+)(\d+)" )

s=p.findall(text, 5 )

print (t1)

print (t2)

print (t3)

print (s)

返回:

['小张34', '小明16', '欧阳大明45', '小曾32']

['小张', '小明', '欧阳大明', '小曾']

[('小张', '34'), ('小明', '16'), ('欧阳大明', '45'), ('小曾', '32')]

[('明', '16'), ('欧阳大明', '45'), ('小曾', '32')]


4、用迭代器存储匹配成功对象

Finditer()函数与findall()函数功能相似,区别在于findall()函数匹配成功后返回的是列表, 列表中存储是的匹配成功的数据,而finditer()函数匹配成功后返回的是迭代器, 并且迭代器中存储的民匹配成功的re.match对象。

Finditer()函数匹配成功后,可以用循环语句取出迭代器中的数据,也可以用list()函数对迭代数转换。


import re

text= "小张34小明16欧阳大明45小曾32"

p=re.compile( "(\D+)(\d+)" )

s=p.finditer(text)

for n in s:

print (n)

返回:

<re.Match object; span=(0, 4), match='小张34'>

<re.Match object; span=(4, 8), match='小明16'>

<re.Match object; span=(8, 14), match='欧阳大明45'>

<re.Match object; span=(14, 18), match='小曾32'>


1、 获取re.match对象的相关信息

可以返回re.match对象的函数有 match(),fullmatch(),search()以及findite()这4个函数

方法或属性 注释
String 被匹配的字符串
Re 正则表达式的对象
Lastgroup 返回最后一个分组的名字,没有产生匹配返回none
Lastindex 捕获组的最后分组索引值,相当于计算分组的组数,没有分组则返回
Endpos 定位被匹配字符串的终点位置,可看做字符串长度
Pos 定位被匹配字符串的起点位置,默认是0,用户如果重新指定起点位置,该属性则随之改变
Span([group]) 返回匹配成功的字符串位置,返回一个二元组(起点,终点),span()
和span(0)表示匹配的起始位置,也可以返回指定分组的起止位置,

import re

text= "小张34小明16欧阳大明45小曾32"

p=re.compile( "(\D+)(\d+)" )

s=p.finditer(text,4)

for n in s:

print (n)

print ("--------")

print (n.span())

print (n.pos)

返回:

<re.Match object; span=(4, 8), match='小明16'>;

--------

(4, 8)

4

<re.Match object; span=(8, 14), match='欧阳大明45'>

--------

(8, 14)

4

<re.Match object; span=(14, 18), match='小曾32' >

--------

(14, 18)

4